﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CMS_GYM.Interface
{
    public partial class frmXuatPhieuChi : Form
    {
         #region Attributes
        //private clsDoiTacDTO DoiTac = null;
        #endregion

        #region Construction
        public frmXuatPhieuChi()
        {
            InitializeComponent();
        }

        #endregion

        #region Events
        // Hàm bắt sự kiện nhấn một phím trên Form. CTRL + ....
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            bool bKetQua = false;
            try
            {

                //------------------------------------
                if (keyData == Keys.Escape || (keyData == (Keys.Control | Keys.W)))
                {
                    this.Close();
                    bKetQua = true;
                }
                else if ((keyData == (Keys.Alt | Keys.T)))
                {
                    this.gvPhieuThuChiTiet.Focus();
                    ThemMotDongTrong();
                    gvPhieuThuChiTiet.CurrentCell = gvPhieuThuChiTiet.Rows[gvPhieuThuChiTiet.Rows.Count - 1].Cells["NoiDung"];
                    gvPhieuThuChiTiet.FirstDisplayedCell = gvPhieuThuChiTiet.Rows[gvPhieuThuChiTiet.Rows.Count - 1].Cells["NoiDung"];
                    bKetQua = true;
                }
                else if (keyData == (Keys.Control | Keys.S) && (btnThuTien.Enabled))
                {
                    btnThuTien_Click(null, null);
                    bKetQua = true;
                }
                else if (keyData == Keys.F5)
                {
                    LamTuoiManHinh();
                    bKetQua = true;
                }
                else
                    // bKetQua = base.ProcessCmdKey(ref msg, keyData);
                    bKetQua = false;
                return bKetQua;
            }
            catch (Exception) { }

            return bKetQua;
        }

        private void gvPhieuThuChiTiet_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData ==( Keys.Control | Keys.D))
            {
                try
                {
                    int r = gvPhieuThuChiTiet.CurrentCell.RowIndex;
                    if (r >= 0)
                    {
                        gvPhieuThuChiTiet.Rows.RemoveAt(r);
                        TinhTongCongNo();
                    }
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(
                }
            }
        }

        private void gvPhieuThuChiTiet_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
                {
                    if (string.Equals(gvPhieuThuChiTiet.Columns[e.ColumnIndex].Name, "TienChi"))
                    {
                        TinhTongCongNo();
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }

        //private void gvPhieuThuChiTiet_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        //{
        //    if (e.Control is DataGridViewComboBoxEditingControl)
        //    {
        //        ((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown;
        //        ((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems;
        //        ((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
        //    }
        //}

        private void frmXuatPhieuChi_Load(object sender, EventArgs e)
        {
            KhoiTaoManHinh();
            SetPermission();
        }

        private void btnThuTien_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                int indexforcus = 0;
                if (KiemTraKhoiTaoPhieuChi(ref Error, ref indexforcus))
                {

                    clsPhieuChiTienDTO PhieuChi = KhoiTaoPhieuChi(ref  Error);
                    if (!new clsPhieuChiTienBUS().KiemTraTonTai(PhieuChi.SoPhieuChi, PhieuChi.KyHieu))
                    {
                    #region thực hiện
                    try
                    {
                        CSQLServer.BeginTran();
                        if (new clsPhieuChiTienBUS().Them(ref PhieuChi, ref Error))
                        {
                            CSQLServer.Commit();
                            MessageBox.Show("Lưu phiếu chi thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            LamTuoiManHinh();
                            string SoPhieuChiMoi = PhatSinhSoPhieuChiTiepTheo(txtSoPhieuChi.Text.Trim(), ref Error);
                            txtSoPhieuChi.Text = SoPhieuChiMoi;
                            GhiSoPhieuChiVaKyHieuMacDinh(SoPhieuChiMoi, txtKyHieu.Text.Trim());
                        }
                        else
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    catch (Exception ex)
                    {
                        CSQLServer.RollBack();
                        MessageBox.Show("Thực hiện thu tiền xuất phiếu chi không thành công nguyên nhân do " + Error + "!", "Chức năng thu tiền xuất phiếu chi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    #endregion

                    }
                    else
                    {
                        Error = "phiếu chi với số phiếu chi '" + PhieuChi.SoPhieuChi + "' và ký hiệu '" + PhieuChi.KyHieu + "' đã tồn tại trong hệ thống!";
                        MessageBox.Show(Error, "Chức năng thu tiền xuất phiếu chi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show(Error, "Chức năng thu tiền xuất phiếu chi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    //SetFocus(9);
                }
            }
            catch(Exception ex)
            {
                
            }
        }

        #endregion 

        #region Funtions
        private void KhoiTaoManHinh()
        {
            gvPhieuThuChiTiet.AutoGenerateColumns = false;
            gvPhieuThuChiTiet.Columns["TienChi"].ValueType = typeof(decimal);
            txtdNgayXuat.value = DateTime.Now;
            DocSoPhieuChiVaKyHieuMacDinh();
            ThemMotDongTrong();
        }

        private void DocSoPhieuChiVaKyHieuMacDinh()
        {
            txtSoPhieuChi.Text = clsSupport.ReadAppConfig("SoPhieuChi");
            txtKyHieu.Text = clsSupport.ReadAppConfig("KyHieuPhieuChi");
            if (string.IsNullOrEmpty(txtSoPhieuChi.Text) || string.IsNullOrEmpty(txtKyHieu.Text))
            {
                MessageBox.Show("Không đọc được Số phiếu chi hoặc Ký hiệu phiếu chi nguyên nhân có thể user của bạn không có quyền đọc và ghi Registry!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void GhiSoPhieuChiVaKyHieuMacDinh(string SoPhieuChi, string KyHieu)
        {
            string Error = string.Empty;
            clsSupport.WriteAppConfig("SoPhieuChi", SoPhieuChi);
            clsSupport.WriteAppConfig("KyHieuPhieuChi", KyHieu);
        }

        private string PhatSinhSoPhieuChiTiepTheo(string SoPhieuChi,ref string Error)
        {
            try
            {
                int iSoPhieuChi = int.Parse(SoPhieuChi);
                iSoPhieuChi += 1;
                //Số ký tự phiếu chi
                int SoKTPT = SoPhieuChi.Length;
                //Số ký tự của số sau khi tăng 1 đơn vị
                int SoKTPS = iSoPhieuChi.ToString().Length;
                string SoPhieuChiMoi = string.Empty;
                for (int i = 1; i <= SoKTPT - SoKTPS; i++)
                {
                    SoPhieuChiMoi += "0";
                }
                SoPhieuChiMoi += iSoPhieuChi.ToString();
                return SoPhieuChiMoi;
            }
            catch(Exception ex)
            {
                Error = "Phát sinh số phiếu chi mới không thành công";
                return string.Empty;
            }
        }

        private void LamTuoiManHinh()
        {
            //DoiTac = null;
            txtMaDoiTac.Text = string.Empty;
            txtTenDoiTac.Text = string.Empty;
            txtMaSoThue.Text = string.Empty;
            txtDiaChiaXHD.Text = string.Empty;
            txtGhiChu.Text = string.Empty;
            gvPhieuThuChiTiet.Rows.Clear();
            lblTongTienThu.Text = "0";
            txtTenDoiTac.Focus();

        }

        /// <summary>
        /// Them mot dong co noi dung tren luoi thu tien
        /// </summary>
        /// <param name="TheId"></param>
        /// <param name="NoiDung"></param>
        /// <param name="TienThu"></param>
        /// <param name="ChietKhau"></param>
        /// <param name="TKNo"></param>
        /// <param name="TKCo"></param>
        private void ThemMotDongVaoLuoiThuTien( string NoiDung, Decimal TienChi,  string TKNo, string TKCo)
        {
            Boolean Flag = false;
            this.gvPhieuThuChiTiet.Focus();
            for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
            {
                if (KiemTraDongThuTienTrong(i))
                {
                    GanGiaTriMotDongLuoiThuTien(i,  NoiDung, TienChi, TKNo, TKCo);
                    Flag = true;
                    break;
                }
            }
            if(!Flag)
            {
                ThemMotDongTrong();
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    if (KiemTraDongThuTienTrong(i))
                    {
                        GanGiaTriMotDongLuoiThuTien(i,  NoiDung, TienChi, TKNo, TKCo);
                        Flag = true;
                        break;
                    }
                }
            }
        }
        
        /// <summary>
        /// Kiem tra mot dong trong tren luoi thu tien
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        private bool KiemTraDongThuTienTrong(int i)
        {
            if ((gvPhieuThuChiTiet.Rows[i].Cells["NoiDung"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["NoiDung"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["TienChi"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TienChi"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString()))
                )
            {
                return true;
            }
            return false;
        }

        private void GanGiaTriMotDongLuoiThuTien(int DongChi,string NoiDung, Decimal TienChi, string TKNo, string TKCo)
        {
            gvPhieuThuChiTiet.Rows[DongChi].Cells["NoiDung"].Value = NoiDung;
            gvPhieuThuChiTiet.Rows[DongChi].Cells["TienChi"].Value = TienChi;
            gvPhieuThuChiTiet.Rows[DongChi].Cells["TaiKhoanNo"].Value = TKNo;
            gvPhieuThuChiTiet.Rows[DongChi].Cells["TaiKhoanCo"].Value = TKCo;
        }
      
        /// <summary>
        /// Them mot dong trong tren luoi thu tien
        /// </summary>
        private void ThemMotDongTrong()
        {
            object[] obj = new object[4]{null,null,null,null};
            gvPhieuThuChiTiet.Rows.Add(obj);
        }

        /// <summary>
        /// Khoi tao mot phieu thu
        /// </summary>
        /// <param name="Error"></param>
        /// <returns></returns>
        private clsPhieuChiTienDTO KhoiTaoPhieuChi(ref string Error)
        {
            clsPhieuChiTienDTO PhieuChi = new clsPhieuChiTienDTO();
            PhieuChi.SoPhieuChi = txtSoPhieuChi.Text;
            PhieuChi.KyHieu = txtKyHieu.Text;
            PhieuChi.Ky = txtdNgayXuat.value.ToString("MM/yyyy");
            PhieuChi.NgayXuat = txtdNgayXuat.value;
            PhieuChi.DoiTacId = null;
            PhieuChi.MaDoiTac = txtMaDoiTac.Text;
            PhieuChi.HoTen = txtTenDoiTac.Text;
            PhieuChi.MaSoThue = txtMaSoThue.Text;
            PhieuChi.DiaChi = txtDiaChiaXHD.Text;
            PhieuChi.NguoiNhan = txtNguoiNhan.Text;
            PhieuChi.PhanTramThue = 0;
            PhieuChi.GhiChu = txtGhiChu.Text;
            PhieuChi.NguoiTaoId = clsUser.NhanVienId;
            for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
            {
                if (!KiemTraDongThuTienTrong(i))
                {
                    clsPhieuChiTienChiTietDTO PTCT = KhoiTaoPhieuChiChiTiet(i, 0);
                    if (PTCT == null)
                    {
                        Error = "Khởi tạo phiếu chi chi tiết không thành công!";
                        return null;
                    }
                    else
                    {
                        PhieuChi.TongTienChi += PTCT.TienChi;
                        PhieuChi.TongTienHang += PTCT.TienHang;
                        PhieuChi.TongTienThue += PTCT.TienThue;
                        PhieuChi.CacPCCT.Add(PTCT);
                    }
                }
            }

            return PhieuChi;
        }

        /// <summary>
        /// Khoi tao mot phieu thu chi tiet
        /// </summary>
        /// <param name="i"></param>
        /// <param name="ThueGTGT"></param>
        /// <returns></returns>
        private clsPhieuChiTienChiTietDTO KhoiTaoPhieuChiChiTiet(int i, int ThueGTGT)
        {
            try
            {
                clsPhieuChiTienChiTietDTO PCCT = new clsPhieuChiTienChiTietDTO();
                PCCT.NoiDung = gvPhieuThuChiTiet.Rows[i].Cells["NoiDung"].Value.ToString();
                PCCT.TienChi = Double.Parse(gvPhieuThuChiTiet.Rows[i].Cells["TienChi"].Value.ToString());
                PCCT.TienThue = ThueGTGT > 0 ? Math.Round(PCCT.TienChi / ThueGTGT, 0) : 0;
                PCCT.TienHang = PCCT.TienChi - PCCT.TienThue;
                PCCT.TaiKhoanNo = gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString();
                PCCT.TaiKhoanCo = gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString();
                return PCCT;
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        private bool KiemTraKhoiTaoPhieuChi(ref string strError, ref int indexforcus)
        {
            bool Flag = true;
            strError = "Lỗi phát sinh: ";

            #region Kiểm tra phiếu chi
            //Kiểm tra Tên khách hàng 
            string TEN_TB = txtTenDoiTac.Text;
            if (TEN_TB.Trim() == "")
            {
                strError += "\n + Tên đối tác không được bỏ trống!";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra Dia chi 
            ////Kiểm tra Tên khách hàng 
            //string DiaChiXHD = txtDiaChiaXHD.Text;
            //if (DiaChiXHD.Trim() == "")
            //{
            //    strError += "\n + Địa chỉ xuất phiếu chi không được bỏ trống!";
            //    indexforcus = 9;
            //        return false; 
            //}
            #endregion

            #region Kiểm tra định dạng số phiếu chi
            //Kiểm tra định dạng số phiếu chi
            string SO_PHIEU_THU = this.txtSoPhieuChi.Text.Trim().Replace(" ", "");
            int SoPhieuThu;
            if (!(SO_PHIEU_THU.Trim() != "" && (SO_PHIEU_THU.Length == 6 || SO_PHIEU_THU.Length == 7) && int.TryParse(SO_PHIEU_THU, out SoPhieuThu)))
            {
                strError += "\n + Số phiếu chi theo định dạng: Số phiếu chi là số gồm 6 hoặc 7 chữ số ví dụ: 000001, 101111, 1234567 ...";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra ký hiệu phiếu chi (Đã được kiểm tra trên control)
            //Kiểm tra ký hiệu phiếu chi (Đã được kiểm tra trên control)
            string KY_HIEU_HD = this.txtKyHieu.Text;
            if (KY_HIEU_HD == null || KY_HIEU_HD.Trim() == "")
            {
                strError += "\n + Ký hiệu phiếu chi không được bỏ trống!";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra ID nhân viên
            //Kiểm tra ID nhân viên thu tiền
            int MaNguoiDung;
            if (!int.TryParse(clsUser.NhanVienId.ToString(), out MaNguoiDung) && Flag)
            {
                strError += "\n + Không lấy được thông tin người dùng đã đăng nhập!";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra lưới thu tiền
            //Kiểm tra lưới thu tiền
            CMS_DinhKhoan DinhKhoan = new CMS_DinhKhoan();
            List<DINH_KHOAN_NO> DinhKhoanNo =DinhKhoan.GetListDinhKhoanNoCoHieuLuc();
            List<DINH_KHOAN_CO> DinhKhoanCo = DinhKhoan.GetListDinhKhoanCoChiPhiCoHieuLuc();
            if (!KiemTraLuoiThuTien(DinhKhoanNo,DinhKhoanCo, ref strError))
            {
               indexforcus = 9;
               return false; 
            }
            #endregion

            return true;
        }

        /// <summary>
        /// Kiểm tra lưới thu tiền
        /// </summary>
        /// <param name="ThueGTGT"></param>
        /// <param name="Error"></param>
        /// <returns></returns>
        private bool KiemTraLuoiThuTien(List<DINH_KHOAN_NO> DinhKhoanNo, List<DINH_KHOAN_CO> DinhKhoanCo, ref string Error)
        {
            int Count = 0;
            try
            {
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    if (!KiemTraDongThuTienTrong(i))
                    {
                        Count++;
                        Decimal TienChi;
                        int TaiKhoanNo;
                        int TaiKhoanCo;
                        if (gvPhieuThuChiTiet.Rows[i].Cells["NoiDung"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["NoiDung"].Value.ToString()))
                        {
                            Error = "Ô 'Nội dung' thu tiền không được bỏ trống ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        if (gvPhieuThuChiTiet.Rows[i].Cells["TienChi"].Value == null || !Decimal.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TienChi"].Value.ToString(), out TienChi) || TienChi <= 0)
                        {
                            Error = "Ô 'Tiền chi' phải nhập là số nguyên dương ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        
                        if (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value == null || !int.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString(), out TaiKhoanNo))
                        {
                            Error = "Ô 'TK Nợ' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        else
                        {
                            if (!KiemTraDinhKhoanNo(DinhKhoanNo, TaiKhoanNo))
                            {
                                Error = "Ô 'TK Nợ' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản nợ!";
                                return false;
                            }
                        }
                        if (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value == null || !int.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString(), out TaiKhoanCo))
                        {
                            Error = "Ô 'TK Có' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        else
                        {
                            if (!KiemTraDinhKhoanCo(DinhKhoanCo, TaiKhoanCo))
                            {
                                Error = "Ô 'TK Có' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản chi phí!";
                                return false;
                            }
                        }
                    }
                }
                if (Count == 0)
                {
                    Error = "Nhập Thông tin chi tiết phiếu chi không được bỏ trống!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                Error = "Khởi tạo phiếu chi không thành công! xin vui lòng kiểm tra lại \r\n" + ex.Message;
                return false;
            }

        }

        private bool KiemTraDinhKhoanNo(List<DINH_KHOAN_NO> DinhKhoanNo,int TaiKhoanNo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanNo.Count; i++)
                {
                    if (DinhKhoanNo[i].TAI_KHOAN_NO == TaiKhoanNo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        private bool KiemTraDinhKhoanCo(List<DINH_KHOAN_CO> DinhKhoanCo, int TaiKhoanCo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanCo.Count; i++)
                {
                    if (DinhKhoanCo[i].TAI_KHOAN_CO == TaiKhoanCo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        } 

        private void TinhTongCongNo()
        {
            try
            {
                double TongTienChi = 0;
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    double TienChi;
                    if (double.TryParse((gvPhieuThuChiTiet.Rows[i].Cells["TienChi"].Value == null ? "0" : gvPhieuThuChiTiet.Rows[i].Cells["TienChi"].Value.ToString()), out TienChi))
                    {
                        TongTienChi += TienChi;
                    }
                }

                lblTongTienThu.Text = clsSupport.CurrencyNumber(TongTienChi.ToString());
                lblSoTienChu.Text = hsTool.ConvertMoneyToText(TongTienChi.ToString());
            }
            catch(Exception ex)
            {}
            
        }

        private void SetPermission()
        {
            btnThuTien.Enabled = clsUser.LayThongTinPhanQuyen("PhieuChi").ChucNang.Them;
        }

        #endregion

    }
}
